package com.zhy.learning.demo.secondkill;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * @author zhy
 * @date 2020/3/20 2:31 下午
 * @description 秒杀
 */
public class SecondKill {

    private static final Logger logger = LoggerFactory.getLogger(SecondKill.class);

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    public void kill() {
        /**
         * 判断商品编号在不在秒杀活动里面
         */

        /**
         * 利用订单编号生成器生成订单编号，并判断是否下过单(redis)
         */

        /**
         * 开启redis事务
         */
        stringRedisTemplate.setEnableTransactionSupport(Boolean.TRUE);

        /**
         * 使用redis的watch，观察该商品key，当该key被其他客户端改变时，则会中断当前的操作
         */
        stringRedisTemplate.watch("商品编号key");

        /**
         * 获取redis里，商品编号的库存
         */
        stringRedisTemplate.opsForValue().get("商品编号key");

        /**
         * 如果库存<0，返回秒杀已经结束
         */

        /**
         * 事务
         */
        stringRedisTemplate.multi();

        /**
         * 下单成功，商品库存-1
         */
        stringRedisTemplate.boundValueOps("商品编号key").decrement(1);

        /**
         * 下单成功的订单放入redis
         */
        stringRedisTemplate.opsForSet().add("秒杀订单", "订单编号");

        /**
         * 执行事务
         */
        List<Object> exec = stringRedisTemplate.exec();

        if (CollectionUtils.isEmpty(exec)) {
            stringRedisTemplate.opsForList().leftPush("订单状态", "订单编号-商品编号-秒杀失败");
        } else {
            stringRedisTemplate.opsForList().leftPush("订单状态", "订单编号-商品编号-秒杀成功");
        }


    }
}
